iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
自我挑戰組

不嚴謹的量子計算雜談系列 第 21

[QSP / QSVT] QSVT 應用實作:AA

  • 分享至 

  • xImage
  •  

今天我們要來實作基於 QSVT 的振幅放大演算法。首先我們定義:

def amplitude_amplification(
        circ: QuantumCircuit,	# `circ` 是用來準備初始態的電路 
        state: str,				# state = "011" 代表 |t> = |011>
        positions: list,		# 我們可能只想放大「部分的」量子態,因此要指定位置 (稍後舉例)
        transformation = 'chebyshev' # 指定用於 AA 的函數,此處省略不談
) -> QuantumCircuit

假設初始態 和目標態 qubit 的量子態;為了要在投影空間做 phase shift (QSVT 中的 ),我們需要一個輔助 qubit。於是我們宣告:

n = circ.num_qubits
qr = QuantumRegister(n + 1)
qc = QuantumCircuit(qr)

接下來,我們必須指定用來逼近 sign 函數

https://ithelp.ithome.com.tw/upload/images/20230930/20162470OVjodqjIUU.png

的角度序列 (其代表一個多項式);這裡,我們使用 pyqsp 來產生角度:

pyqsp --plot-npts=4000 --plot-positive-only --plot-magnitude --plot --seqargs=21,1.0e-20 --seqname fpsearch angles --output-json

執行上述指令可以得到一 Wx-convention 的角度序列:

Wx_seq = [-1.6289766249603586, -1.454208011876622, -1.7462485302871582, -1.3357954977223736, -1.8662600481340057, -1.213725811224108, -1.9908459961512452, -1.0861701139264175, -2.1218145928902925, -0.9513642785202095, -2.260851457478332, -0.8077485591343427, -2.4093286369239166, -0.6542153401660733, -2.567999066787916, -0.49046601602792345, -2.736605610844485, -0.3174051062134276, -2.9135294062485397, -0.13739160893601188, -3.0957015611621053, -3.0957015611621053, -0.13739160893601188, -2.9135294062485397, -0.3174051062134276, -2.736605610844485, -0.49046601602792345, -2.567999066787916, -0.6542153401660733, -2.4093286369239166, -0.8077485591343427, -2.260851457478332, -0.9513642785202095, -2.1218145928902925, -1.0861701139264175, -1.9908459961512452, -1.213725811224108, -1.8662600481340057, -1.3357954977223736, -1.7462485302871582, -1.454208011876622, -1.6289766249603586]

利用之前在 QSVT 基本框架實作提到的 convert_convention(...)

d, phi_seq = convert_convention(Wx_seq)

# phi_seq *= -2 是為了符合 Rz (以 Z 為軸的旋轉) 閘的定義: 若我們的 phase 是 p,則我們需要轉 -2p。
# 也就是說,phase 和旋轉角度之間存在 -2 這個常數倍數的差異!
phi_seq *= -2

完成這些準備工作後,剩下就是單調的 QSVT 操作啦 (詳見完整程式碼)!

等等,既然這是基於 QSVT 的 AA,為什麼我們不直接使用之前實作的基本框架呢?這是因為,在基本框架中, ;但是在這裡,,而 可以任意變動!不過別擔心,之後的實作應用將會使用該框架!

最後,來看看我們剛剛完成的 amplitude_amplification(...) 要如何使用!首先建立準備 的電路

# 欲操作的量子暫存器大小
n = 3
# 這裡指定 positions = [0, 1],代表整個只有前兩個 qubit 是 AA 的對象
positions = [0, 1]
# |t> = |11>
search_state = "11"

# 以下即為電路 Q
circ = QuantumCircuit(n)
circ.h([0, 1, 2])
circ.x(0)
circ.cp(theta=np.pi/3, control_qubit=0, target_qubit=1)
circ.rz(phi=np.pi/6, qubit=2)
circ.h([0, 1, 2])

# 使用上述定義的 AA
qc = amplitude_amplification(circ, search_state, positions, 'AA')

下圖為電路 Q:

	 ┌───┐   ┌───┐            ┌───┐
q_0: ┤ H ├───┤ X ├────■───────┤ H ├
     ├───┤   └───┘    │P(π/3) ├───┤
q_1: ┤ H ├────────────■───────┤ H ├
     ├───┤┌─────────┐  ┌───┐  └───┘
q_2: ┤ H ├┤ Rz(π/6) ├──┤ H ├───────
     └───┘└─────────┘  └───┘  

模擬後測量,我們可以得到:

https://ithelp.ithome.com.tw/upload/images/20230930/20162470s9smveR3QW.png

成功!


上一篇
[QSP / QSVT] QSVT 應用實作:QPE
系列文
不嚴謹的量子計算雜談21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言